package main

import (
	"flag"
	"fmt"
)

var mode = flag.String("mode", "", "process mode")

func main() {
	x := 1
	p := &x
	fmt.Println(p)
	fmt.Println(*p)
	*p = 2
	fmt.Println(p)
	fmt.Println(x)
	*p++
	fmt.Println(p)
	fmt.Println(x)

	// 从指针获取指针指向的值
	{
		// 准备一个字符串类型
		var house = "Malibu Point 10880, 90265"
		// 对字符串取地址, ptr类型为*string
		ptr := &house
		// 打印ptr的类型
		fmt.Printf("ptr type: %T\n", ptr)
		// 打印ptr的指针地址
		fmt.Printf("address: %p\n", ptr)
		// 对指针进行取值操作
		value := *ptr
		// 取值后的类型
		fmt.Printf("value type: %T\n", value)
		// 指针取值后就是指向变量的值
		fmt.Printf("value: %s\n", value)
	}

	// 使用指针修改值
	{
		// 准备两个变量, 赋值1和2
		x, y := 1, 2

		// 交换变量值
		swap(&x, &y)

		fmt.Println(x, y)
	}

	// 示例：使用指针变量获取命令行的输入信息
	{
		// 解析命令行参数
		flag.Parse()

		fmt.Println(*mode)
	}

	// 创建指针的另一种方法-----new()函数
	{
		str := new(string)
		*str = "Go语言教程"
		fmt.Println(*str)
		fmt.Printf("str ptr %p\n", str)
	}
}

func swap(a, b *int) {
	t := *a
	*a = *b
	*b = t
}
